# 1. 编译选项
CXX = g++
CXXFLAGS = -Wall -g -L/usr/lib/x86_64-linux-gnu

# 2. 链接选项
LDFLAGS = -llapacke -lblas

# 3. python选项
PY = python3

# 找到所有的C++源文件，位于 src 目录下
SRC_CPP = $(wildcard src/*.cpp)
# 生成目标可执行文件列表（去掉源文件路径和后缀）
TARGETS_CPP = $(SRC_CPP:src/%.cpp=src/%)

# 找到所有的Python源文件，位于 src 目录下
SRC_PY = $(wildcard src/*.py)
# 目标是运行Python脚本，不需要生成文件
TARGETS_PY = $(SRC_PY)

# 找到所有的TeX源文件，位于 doc 目录下
OBJ_TEX = $(wildcard doc/*.tex)
# 所有TeX文件名
NAME_TEX = $(OBJ_TEX:doc/%.tex=%.tex)

# 图片文件，假设图片位于 figure 目录下
FIGURES = $(wildcard figure/*)

# 中间文件位于 build 目录下
BUILD_DIR = src/build

# 默认目标
all: run doc

# 对于每个源文件，生成相应的可执行文件
# 使用 BUILD_DIR 作为中间文件目录
$(BUILD_DIR)/%.o: src/%.cpp
	@mkdir -p $(BUILD_DIR)  # 确保 build 目录存在
	$(CXX) $(CXXFLAGS) -c -o $@ $<

# 对于每个目标，生成可执行文件
src/%: $(BUILD_DIR)/%.o
	$(CXX) -o $@ $^ $(LDFLAGS)  # 使用 LDFLAGS 传递链接选项

# 执行所有可执行文件
run: $(TARGETS_CPP) $(TARGETS_PY)
	@for exe in $(TARGETS_CPP); do \
		echo "Running $$exe..."; \
		./$$exe; \
	done
	@for script in $(SRC_PY); do \
		echo "Running $$script..."; \
		$(PY) $$script; \
	done

# 处理文档生成
doc: $(OBJ_TEX)
	@cd doc; \
	for texname in $(NAME_TEX); do \
		echo "Processing $$texname..."; \
		xelatex $$texname; \
		bibtex $(basename $$texname .tex).aux; \
		xelatex $$texname; \
		xelatex $$texname; \
	done

# 清理生成的文件
.PHONY: all clean doc run 
clean:
	# 进入 doc 目录并删除生成的文件，同时调用 latexmk 清理
	cd doc && rm -f *.aux *.bbl *.blg *.log *.run.xml *.synctex.gz *.csv main.bbl main-blx.bib && latexmk -c
	# 删除可执行文件
	rm -f $(TARGETS_CPP)
	# 删除构建目录及其中间文件
	rm -rf $(BUILD_DIR)
